iT邦幫忙

2024 iThome 鐵人賽

DAY 29
0
Python

上次介紹的棒球套件很少更新了,那就只好自己寫一個!?系列 第 29 篇

Day 29 - 使用 logging 顯示更多訊息給使用者

  • 分享至 

  • xImage
  •  

在昨天有簡單提到了一下 logging 這個工具,今天會再做更深入的介紹,因為當使用者在使用我們的套件的時候,提供好的訊息也可以讓他們更快更容易的操作,我們在開發的時候有時候也能透過這些額外的資訊更好除錯。今天的文章也會參考官方的文件進行介紹。

Level

要使用 logging,因為是 Python 內建的功能,所以可以直接 import 後就能使用。昨天我們是直接使用 basicConfig 進行 logging 的設定:

import logging
logging.basicConfig(level=logging.DEBUG)

這段程式碼的意思就是,把顯示 logging 的 level 改成 DEBUG,他總共會有五種 level,分別為:

  • DEBUG:提供詳細的說明,通常會先隱藏,讓有需要的人再來查看,用來診斷跟分析問題會使用。
  • INFO:用來確認事件是否完成,或是程式是否如預期中運行會使用,提供一些簡單的資訊確認。
  • WARNING:回報未來可能會造成問題的警告,或是提醒非預期的事情發生。
  • ERROR:回報程式發生什麼錯誤,可能造成哪些功能無法使用。
  • CRITICAL:回報更嚴重的錯誤產生,可能造成整個程式無法運作。

他們的顯示優先度也照著上面的排列,假設 level 設成 DEBUG 會全部都顯示,如果是設成 ERROR,那就只會顯示 ERROR 跟 CRITICAL。
熟悉這五個類別,就可以判斷出我們在提供說明資訊的時候,應該套用哪個 level,或是在看別人的 logging 的時候,能判斷出訊息中的類別,更快能找到需要優先閱讀的項目。
通常預設顯示都是到 WARNING,當我們想要看更多詳細資訊的時候才會把 level 調整成 DEBUG。上面那段程式碼就是把預設進行修改,所以我們才能看到 requests 套件提供的更多訊息。

Logger

如果是直接使用 basicConfig 的話,他會直接一次影響到所有的 logging 顯示,但我們可能會想讓不同的 function,顯示不同的 level。譬如說我平常使用的時候,不會特別想知道 DEBUG 裡的訊息,想要再發生問題的時候,進行除錯時再打開。這時候就可以使用 logger 進行 level 的調整。

logger 的概念就很像他是一個獨立出來的 config,可以進行設定的調整,但不影響到其他 logger。要產生他也很簡單,只要使用 logging 的 getLogger 就好,程式碼如下:

import logging

# 這行還是要,有點像是初始化的感覺
logging.basicConfig()
logger = logging.getLogger()

這樣我們就會獲得一個 logger,之後我們就能使用 logger.setLevel() 來改變顯示的優先度,也可以開始使用像是 logger.info() 來提供我們自製的訊息:

logger.setLevel(logging.INFO)

logger.debug("Test 1")
logger.info("Test 2")
logger.error("Test 3")

上面的程式碼代表我們先把優先度設成 INFO,然後下面會是我們的自製說明。由於我們現在的優先度是 INFO,所以 Test 1 這個訊息不會顯示,其他則會顯示像是:
https://ithelp.ithome.com.tw/upload/images/20241013/20163024nFCh4QGCbv.png

可以看到 logger 會根據我們使用的 level 來顯示訊息,中間那個 root 是指 logger 的名稱,因為我們在 getLogger 的時候沒傳入字串進去,所以會是預設的 root。我們可以傳入自己想要的命名,或是使用 getLogger(__name__) 來讓名稱變成當前 logger 所在的模組名稱。
這個顯示的格式,其實也可以透過 basicConfig 去定義,只要更新 format 參數就可以,可以參考文章裡的:Changing the format of displayed messages

根據參數改變優先度

有了 logger 後,我們可以在我們的 function 裡多加一個 debug 參數,如果他是 True,我們就能把優先度改變成 DEBUG,這樣我們可以讓使用者手動決定要不要顯示更詳細的訊息,一樣是使用到 setLogger,程式碼可以寫成這樣:

import logging

logging.basicConfig()
logger = logging.getLogger()

def statcast_search(**params, debug = False):
    if (debug):
        logger.setLogger(logging.DEBUG)
    # other code...

透過一個簡單的判斷式去處理,然後預設 debug 為 False。之後我們就可以使用 logger.debug 來存放一些除錯用的詳細訊息,像是輸入的 params 長得如何,或是組合完給 requests 的 URL,或是一些當前的設定,都可以使用。

本日小結

今天再更深入介紹 logging 這個內建功能,如果使用好的話,能讓不管使用者或開發者,都能獲得更詳細分好類的資訊,是個在開發 Python 套件時的實用工具,是個比直接使用 print 來除錯外更好的選擇。另外他在 Python 當 API Server 的時候也是一個很好用的工具,可以透過 level 快速找到問題,大家可以多熟悉這個工具。

最後一樣感謝大家耐心地看到這,這已經是倒數第二天的文章,真的很感謝,有任何的問題與建議一樣歡迎大家在留言告訴我,明天會做個這次鐵人賽的總整理,明天見,掰掰。


上一篇
Day 28 - 簡單使用 timeit 測試程式執行時間與 requests.Session() 增加效能
下一篇
Day 30 - 總整理以及鐵人賽心得
系列文
上次介紹的棒球套件很少更新了,那就只好自己寫一個!? 共 31 篇
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言